package main

import "fmt"

type animal interface {
	move()
	eat(string)
}
type cat struct {
	name string
	foot int8
}

// 值实现接口
func (c cat) move() {
	fmt.Println("走猫步。。。")

}
func (c cat) eat(food string) {
	fmt.Printf("吃%s。。。\n", food)

}

type chicken struct {
	foot int8
}

// 指针实现接口
func (c *chicken) move() {
	fmt.Println("公鸡飞。。。")

}
func (c *chicken) eat(food string) {
	fmt.Printf("公鸡吃%s。。。\n", food)

}

func main() {
	fmt.Println(" 接口是一种类型，规定了变量有哪些类型，不关心变量类型，只关心能调用哪些方法")
	fmt.Println("一个变量实现了接口的所有方法，称之为接口类型的变量")

	var in animal
	fmt.Printf("%T\n", in)

	in1 := cat{
		name: "花猫",
		foot: 4,
	}
	//值接受者能存指针能存值
	in = in1
	in.eat("大于")
	fmt.Printf("%v\n", in)
	fmt.Printf("%T\n", in)
	in2 := chicken{
		foot: 4,
	}
	//指针接受者只能存指针
	in = &in2
	in.eat("鸡饲料")
	fmt.Printf("%v\n", in)
	fmt.Printf("%T\n", in)

}
